import type { MainAppProps } from "#/main";
import 'uno.css';
import '/@/design/index.less';
import 'ant-design-vue/dist/reset.css';
// 注册图标
import 'virtual:svg-icons-register';

import App from './App.vue';
import { createApp } from 'vue';
import { initAppConfigStore } from '/@/config/logics/initAppConfig';
import { router } from '/@/router';
import { setupRouterGuard } from '/@/router/support/guard';
import { store } from '/@/store';
import { setupGlobDirectives } from '/@/directives';
import { registerGlobComp } from '/@/components/registerGlobComp';
import { registerThirdComp } from '/@/settings/registerThirdComp';
import { useAppStoreWithOut } from "/@/store/modules/app";

import { i18n } from '/@/config/i18n/index';
import { setupErrorHandle } from '/@/config/error';

// 程序入口
main();
async function main() {
  // 获取参数
  const props = getMainAppProps();
  // 普通启动
  // 创建应用实例
  const app = createApp(App);
  app.use(store)            // 配置存储
    .use(router)            // 创建路由
    .use(i18n)              // 多语言配置
    ;
  setupRouterGuard(router); // 路由保护
  setupGlobDirectives(app); // 注册全局指令
  setupErrorHandle(app);    // 配置全局错误处理

  setupProps(props);      // 配置参数

  initAppConfigStore();   // 初始化内部系统配置
  registerGlobComp(app);  // 注册全局组件
  await registerThirdComp(app); // 注册第三方组件

  // 当路由准备好时再执行挂载( https://next.router.vuejs.org/api/#isready)
  await router.isReady();
  app.mount('#app');  // 挂载应用
  console.log(" vue3 app 加载完成！")
}

// 获取主应用参数
function getMainAppProps(): MainAppProps {
  // 从 queryString 中获取
  const searchParams = new URLSearchParams(window.location.search);
  // 隐藏侧边栏（菜单）
  let hideSider = searchParams.get('hideSider') === 'true';
  // 隐藏顶部
  let hideHeader = searchParams.get('hideHeader') === 'true';
  // 隐藏 多Tab 切换
  let hideMultiTabs = searchParams.get('hideMultiTabs') === 'true';
  return {
    hideSider,
    hideHeader,
    hideMultiTabs
  }
}

// 配置主应用参数
function setupProps(props?: MainAppProps) {
  if (!props) {
    return
  }
  const appStore = useAppStoreWithOut();
  appStore.setMainAppProps(props);
}
